为什么选择C++?
1 大公司的影响电信公司/google/微软/应用软件厂商(adobe)的确如果没有google,C++在被微软抛弃后,流行性可能更要大跌。
2 应用领域绝大多数的桌面软件,游戏服务器,PC游戏客户端,一部分服务器应用开发,一部分嵌入式软件你不用C++,你和该领域就遥远。
3 高效的本地语言,如果你想带上语言的高级特性,你只有C++可选。
4 泛型编程如果你对此感兴趣,(当然这也是很多人疏远C++的原因),C++是你最正统的选择。
STL有一些需要注意的操心点。但没有语言是可以不操心的,有什么语言你可一上来就胡写乱写不考虑细节吗? 没有如果是java,那么这也是它产生了这世界上最多垃圾程序代码的原因。
如果你讨厌无数时间用来敲一大堆字符,厌恶写Compare。compare(s1,s2); 想写 if( s1==s2) 那么就使用C++吧 !(不过请先注意领域,人必须要先活着再谈兴趣)
1 大公司都严格限制可以使用的库可以很认真的告诉你,STL,Boost这种质量的库,大多时候都是被禁止使用的他们允许使用C++都在严格的限制下使用。
2 桌面软件,游戏软件 C++主要就是做UI而UI部分,用C++开发的很少嵌入式,大多连C++的编译器都不支持除非是终端部分游戏逻辑,都有嵌入式语言支持。
3 所有原语发布,都是C包括不限于 winapi,posix,directx,directsound,Com
4 泛型如果用c来表达,就是增加一个参数,进行分支处理。C++把它搞复杂了用宏的话,比C++更简洁。
综上所述,C++基本上是在价值链的低端生存,而且非常低效至于用到STL,Boost的软件,顶多也就是一些桌面软件的UI部分,大多都是价值非常低的软件,而且质量非常糟糕。当然有些软件部署广泛,也有比较大的价值
不相信,可以自我衡量一下,是不是处在这样的价值链上
为什么C++这样复杂的语言,相应的程序员收入却不好,做得却是最辛苦是有内生的原因。这个原因就是因为C++扼杀了他们的生产力。
反观C,更简洁,待遇却好得多。
甚至这种语言制造了像 bastetwang 这样的怪物,被C++强X之后,产生的斯德哥尔摩综合症,C++一天不FK他,他就不舒服。太神奇了。
引用野鬼的话,我能理解这种怪物C++的工作,辛苦又不来钱,还有人鄙视。
0除了做应用软件的较低,C++工资较高,你不必担心可以查语言工资排行至于C,我只说想说你想找份只用C的工作不容易就像基金公司一样有些娱乐圈的明星很来钱,但大多数走穴唱歌的人都是苦逼。
1 我能说出一堆使用STL的公司,基本大家知道名字的公司都可以使用STL。(不熟悉STL,无法通过面试。)所有的电信公司,所有的游戏公司,腾讯,google,微软,等等等我希望你列出哪家公司有条文: " 大家用STL时候注意了不准什么什么"
2 桌面软件C++不仅仅垄断了GUI 而且逻辑也几乎都是C++应用软件纯C++的,放眼过去几乎都是。你大可以说出一个个桌面软件,然后看看其开发语言游戏业务逻辑在服务端使用脚本有其特殊原因。但没人会拿lua实现服务器网络处理嵌入式有高端和低端区别,有的终端连个C标准库都放不进去。来10个c文件就报代码段溢出, =。=|| 还谈什么C++,但嵌入式不只是匮乏资源的平台,也有平台资源相当丰富的大型设备的嵌入式C++在其中负责逻辑。
3 系统原语完全是C的份,因为只需要支持到这一层。这完全和C++无关难道其它高级语言可以参与? C在这方面已经是垄断地位,有不服C语言ABI的本地语言吗? no小样,系统api还想不想调用了? 这是垄断地位,而不是因为优秀。
4 模板拥有宏的好处,但宏没有模板的强大功能C中无数的宏说明自动产生代码这种功能是有需求的泛型不只是泛型容器,所以不是加参数那么简单如果说面向对象的继承做到拥有同样的接口就可以替换(动态多态),那么模板就是更强的效果,不必你真的有这个函数签名,只需要你的写法能这样写,你就能替换(静态多态)。很宏,但比宏强的多。
就提几点:
1 工作机会,更多在非聚光灯下的这里我也不多说了。可能这里大多看到一些桌面软件和互联网公司c的产业空间,桌面,互联网是非常小的一块如果非要举例,我就说HW。
2 关于大公司的规定核心产品,对库都有严格限制,如果要举例,我还以HW为例还有一些工业公司,比如nuclear,电力控制软件,。。。MS在自己的整个产品线,都不用STL,MFC如果没有严格规定,达不到这样的质量控制至于更底层的,不说你也知道,基本上完全是C。只是因为产业链的原因,大多人接触得少。
3 关于桌面C++份额很小。至于待遇,从HH拿到的资料,C++相比其他,待遇属于偏低的,以及工业等横向和纵向比较相比较C++这种复杂性,可以认为,C++对待遇有负面影响直白得说,就普遍状况,学习以及使用C++,对待遇的影响,基本上是负面的。互联网有些公司待遇可能不错,更多是盈利能力的问题这里仅做普遍比较。
4 模板比宏更高级但是,通常,增加一个参数,连宏都不需要。总之,C可以有更简洁的表达,仅此而已。
我在你所说的大公司。。带一个项目,做大型游戏,说几句
=============
boost是不用,因为太笨重,把代码搞得恶心
stl是肯定用的,久经考验,其带来的好处已经超过了坏处
另外,就我所知,做大型游戏,c++基本是必须的,c的表达力,写起逻辑来很费事,lua这些脚本是会用,但逻辑全靠它就扯淡了
=============
c++缺点太多了。。但是,还是很强大的,关键在于代码组织与控制
==============
我也有11年编码经验。。别扯什么破事,觉得不好用就别用,不必一杆子打倒一船人
另外,我也同意c++标准委员会是一群sb学究,就这样
===============
你说的以下两点纯扯淡,至少在我这个公司
===============
1 大公司都严格限制可以使用的库可以很认真的告诉你,STL,Boost这种质量的库,大多时候都是被禁止使用的他们允许使用C++都在严格的限制下使用。
2桌面软件,游戏软件 C++主要就是做UI而UI部分,用C++开发的很少嵌入式,大多连C++的编译器都不支持除非是终端部分游戏逻辑,都有嵌入式语言支持。
========================
虽然我也在用C++,但是,如果一个项目太过于庞大,我也认为,C做基层,Lua做逻辑控制的效率更好。
================
没有到技术决策层面,无法理解这里面的道理。
如果你是负责人或者你掌握产品研发方向,看问题角度就不一样。
STL,Boost, MFC这种属于演示用途的技术,而不是工程角度的技术。
=====================
C++关键的问题在于想用原始的设计完成高级功能,以前看过一个高人总结的,C++再怎么“面向对象”地继承、多态。。。,编译完之后全都没了。编译机制导致C++不可能成为一个合格的面向对象的语言。
且不讲C++还存在很多设计缺陷,比如没有根类,没有反射;STL这种类似于C的宏定义的模板机制,经过预编译阶段就被替换掉的东西,你能指望它完成多么复杂的工作而不出错?
正因为C++的缺陷,COM、C++ Builder、QT。。。等才加入了很多自己的东西,甚至语法都做了调整,结果还不都是金玉其外败絮其中
=====================
C++的确是一门复杂的语言,我也做了n多年的C++开发,代码量也在几十万行以上,但我还经常会被一些很基本的面试题所迷惑,经常在到底有几个临时变量弄糊涂。
C++的设计理念和原则建议大家读读 Bjarne stroustru 的原话,如果你需要反射、动态类型,那你的确不用考虑C++,因为它本来就不是用干这个的,能干这个的语言也一大把。C++设计之初就考虑与C同等的性能,所以它连根类都没有,如果有根类正好它还有些虚拟方法,那对性能是多大的一个损失啊,当然现实世界的C++基础库都有自己的根类;
C++不完美这是肯定的,它有自己的适合场所。你如果非要拿java或者python甚至或c的眼光来看c++,那你肯定对它非常之不满意。
==================
如果你觉得STL不好用,那你就应该考虑是否选错了语言。比如Java,。Net提供的容器在易用性方面是没话说的。使用C,C++就必须用机器的思维去思考问题,去实现逻辑。所以C,C++的实现都比较偏向底层,纯业务的东西C++的确没有优势。当你C++精通到足可以批判他的不足时你的程序设计思路已经足够接近机器层面,这时你在看STL设计又会觉得设计冗余。所以STL是一个初中级C++程序员(尤其是其他平台语言转过来)觉得不好用,高级C++程序员也觉得不好用的东西。只有处在不上不下的程度,像我这样觉得还够用。呵呵。
==============
STL有点华而不实,如果水平不够,很难写出与之风格一致的代码,我写代码也很少用stl,数据结构顶多用个list vector,map之类的,其他的算法基本很少用它的,迭代器看起来真是累,真心不喜欢。
道生一,一生二,二生万象。OO的思想就是抽象,万象归宗,化繁为简。99%的程序员使用OO,或者所谓的类库的目的就是好用,不必了解内部实现就可以直接达到所期望的结果。这时一种生产力的进步,一种流水线式半零件式的生产流程。程序员只是最后再流水线上拼接起来上个螺丝的工人而已(严格说来是码农)。C++就是抽象万象的利器。用Windows举例子,从无到有这个关键的一步(所谓的底层),通产是C或者汇编。Windows源码大多是C/ASM编写,实现了硬件的抽象统一了抽象接口(中介有众厂商的驱动提供),然后从一生二(内核函数引出到Win API),再用C最简单的包装,隔离底层,再次统一接口,这样底层的变动不会带来上层接口的影响。二生万象,典型的是Com,ActiveX,MFC,ATL。。。这一层则大多是C++了,因为需要C++的OO能力来包装,从语言级别来屏蔽Win API,极大多数程序员这这一层级别疲于奔命,因为这一层M$实现了各种各样的包装,丢掉那一个对他们来说问题不大,但投入n年学习某个包装技术的程序员来说损失就比较大,比如MFC,比如ActiveX等。后来M$有来了一次对Win API的大包装,为此他们特意实现了一套动态语言.Net,他设法把Win API全部隐藏起来对他们来了一次彻底的OO包装,使得使用者完全感觉不到他们的存在,因为这个包装如此大,如此深,于是他们就成了第四层使用者。不断包装的好处就是不断隔离,伟大的先驱对于解决计算机中所有的问题提出都可以加层来解决。于是Windows从1.0到WIndows8可谓发挥的凌厉精致。WinRT算是第2.5层。这样你把C++的OO特性去创造世间本来就是一种对C++不了解的表现,OO的本质是抽象,所以他是抽象世界的东西。开天辟地的创造世界需要的是原语。感觉偏题了,不多扯蛋了。一气呵成,没注意排版,感谢能看完此贴的人。
==================
迭代器确实有很多需要注意的地方. 比如纠正后缀增减的习惯,循环时考虑迭代器被破坏的情况(各个容器又各不一样). 但也就那么几条. 迭代器语法写起来的确累, C++也已经增加auto关键字了.
本页共64段,5140个字符,12558 Byte(字节)